package com.note.middleware.repository;

import com.note.middleware.document.RequestLog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 请求日志仓库接口
 */
@Repository
public interface RequestLogRepository extends MongoRepository<RequestLog, String> {
    
    /**
     * 根据请求ID查找日志记录
     * 
     * @param requestId 请求ID
     * @return 日志记录
     */
    Optional<RequestLog> findByRequestId(String requestId);
    
    /**
     * 查询指定用户的日志记录
     * 
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页日志记录
     */
    Page<RequestLog> findByUserIdOrderByRequestTimeDesc(Long userId, Pageable pageable);
    
    /**
     * 查询指定模块的日志记录
     * 
     * @param module 模块名称
     * @param pageable 分页参数
     * @return 分页日志记录
     */
    Page<RequestLog> findByModuleOrderByRequestTimeDesc(String module, Pageable pageable);
    
    /**
     * 查询指定操作类型的日志记录
     * 
     * @param operationType 操作类型
     * @param pageable 分页参数
     * @return 分页日志记录
     */
    Page<RequestLog> findByOperationTypeOrderByRequestTimeDesc(String operationType, Pageable pageable);
    
    /**
     * 查询指定时间范围内的日志记录
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 分页日志记录
     */
    Page<RequestLog> findByRequestTimeBetweenOrderByRequestTimeDesc(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
    
    /**
     * 查询指定URI的日志记录
     * 
     * @param requestUri 请求URI
     * @param pageable 分页参数
     * @return 分页日志记录
     */
    Page<RequestLog> findByRequestUriOrderByRequestTimeDesc(String requestUri, Pageable pageable);
    
    /**
     * 查询包含异常的日志记录
     * 
     * @param pageable 分页参数
     * @return 分页日志记录
     */
    Page<RequestLog> findByHasExceptionIsTrueOrderByRequestTimeDesc(Pageable pageable);
    
    /**
     * 查询指定客户端IP的日志记录
     * 
     * @param clientIp 客户端IP
     * @param pageable 分页参数
     * @return 分页日志记录
     */
    Page<RequestLog> findByClientIpOrderByRequestTimeDesc(String clientIp, Pageable pageable);
} 